package com.kexio.security.service;

import java.util.List;

import com.kexio.common.dto.PageRequest;
import com.kexio.common.dto.PageResponse;
import com.kexio.security.domain.Permission;

/**
 * 权限业务服务接口
 * 
 * @author kexio
 */
public interface PermissionService {

    /**
     * 创建权限
     * @param permission 权限实体
     * @return 权限实体
     */
    Permission createPermission(Permission permission);

    /**
     * 更新权限
     * @param permission 权限实体
     * @return 权限实体
     */
    Permission updatePermission(Permission permission);

    /**
     * 根据ID获取权限
     * @param id 权限ID
     * @return 权限实体
     */
    Permission getPermissionById(Long id);

    /**
     * 根据权限编码获取权限
     * @param permissionCode 权限编码
     * @return 权限实体
     */
    Permission getPermissionByCode(String permissionCode);

    /**
     * 分页查询权限
     * @param permissionName 权限名称
     * @param permissionType 权限类型
     * @param status 状态
     * @param pageRequest 分页参数
     * @return 分页结果
     */
    PageResponse<Permission> queryPermissions(String permissionName, Integer permissionType, Integer status, PageRequest pageRequest);

    /**
     * 获取所有权限
     * @return 权限列表
     */
    List<Permission> getAllPermissions();

    /**
     * 获取权限树
     * @return 权限树结构
     */
    List<Permission> getPermissionTree();

    /**
     * 根据状态获取权限
     * @param status 状态
     * @return 权限列表
     */
    List<Permission> getPermissionsByStatus(Integer status);

    /**
     * 根据类型获取权限
     * @param permissionType 权限类型
     * @return 权限列表
     */
    List<Permission> getPermissionsByType(Integer permissionType);

    /**
     * 根据父权限ID获取子权限
     * @param parentId 父权限ID
     * @return 权限列表
     */
    List<Permission> getPermissionsByParentId(Long parentId);

    /**
     * 根据用户ID获取权限
     * @param userId 用户ID
     * @return 权限列表
     */
    List<Permission> getPermissionsByUserId(Long userId);

    /**
     * 根据角色ID获取权限
     * @param roleId 角色ID
     * @return 权限列表
     */
    List<Permission> getPermissionsByRoleId(Long roleId);

    /**
     * 启用权限
     * @param id 权限ID
     * @return 是否成功
     */
    boolean enablePermission(Long id);

    /**
     * 禁用权限
     * @param id 权限ID
     * @return 是否成功
     */
    boolean disablePermission(Long id);

    /**
     * 删除权限
     * @param id 权限ID
     * @return 是否成功
     */
    boolean deletePermission(Long id);

    /**
     * 批量删除权限
     * @param ids 权限ID列表
     * @return 删除数量
     */
    int deletePermissions(List<Long> ids);

    /**
     * 检查权限编码是否存在
     * @param permissionCode 权限编码
     * @param excludeId 排除的权限ID
     * @return 是否存在
     */
    boolean existsByPermissionCode(String permissionCode, Long excludeId);

    /**
     * 检查权限名称是否存在
     * @param permissionName 权限名称
     * @param excludeId 排除的权限ID
     * @return 是否存在
     */
    boolean existsByPermissionName(String permissionName, Long excludeId);

    /**
     * 构建权限树
     * @param permissions 权限列表
     * @return 权限树
     */
    List<Permission> buildPermissionTree(List<Permission> permissions);

    /**
     * 获取用户权限编码集合
     * @param userId 用户ID
     * @return 权限编码集合
     */
    java.util.Set<String> getUserPermissionCodes(Long userId);

    /**
     * 检查用户是否有指定权限
     * @param userId 用户ID
     * @param permissionCode 权限编码
     * @return 是否有权限
     */
    boolean hasPermission(Long userId, String permissionCode);
}
